PHP MVC Dispatching
Home

PHP MVC Dispatching

PHP MVC Dispatching

Routing leert ons de weg waar we naar toe willen. Dispatching slaat de opgegeven weg in.

Stappenplan

  1. Voorkennis: PHP Routing

    De methode getRouteData breekt de uri op in de naam van de controllerklasse, de actiemethode en een eventuele parameter. Vertalingen voor routing zijn: routeren ; routetoewijzing ; routering ; routing ; route-bepaling ; route ; reisweg ; vervoerweg ; routebepaling ; routekeuze. En dat is precies wat we in PHP routing hebben gedaan. Meer dus dan een URI splitsen. Deze methode retourneert een associatieve array:

    return array(
        'controllerClassName' => $controllerClassName,
        'actionMethodName' => $actionMethodName,
        'parameterValue' => $parameterValue);
  2. De eenvoudigste manier om te dispatchen is met een switch. In de index.php van de root schrijf je:

    <?php

    // var_dump($_SERVER);
    use ThreepennyMVC\FrontController;
    
    include_once('../vendor/threepennymvc/FrontController.php');
    include_once('./Controllers/AdminController.php');
    // default namespace is root \
    // otherwise specify it as argument
    $route = FrontController::getRouteData($_SERVER['REQUEST_URI'], 'Fricfrac', 'Admin', 'index');
    // var_dump($route);
    switch ($route["controllerClassName"]) {
        case 'Fricfrac\Controllers\AdminController' :
            switch ($route["actionMethodName"]) {
                case 'index' :
                    $controller = new \Fricfrac\Controllers\AdminController();
                    $view = $controller->index();
                break;
            }
    }
    
  3. Dat is geen probleem zolang er niet teveel cases in de switch staan. Maar voor een applicatie als Fric-frac wordt dat al gauw een lange rij. We kunnen dit vereenvoudigen door een dispatchter te schrijven die met behulp van relfection de actiemethode van de controller-klasse uitvoert.
    1. Voor de gevorderden:

      Philip Brown, What is Reflection in PHP?, 2 Jul 2014
      PHP manual: The ReflectionClass class

    2. De dispatch methode heeft $action parameter waarin de routing, die door getRouting werd geretourneerd, wordt doorgegeven. De ReflectionClass van PHP gebruikt die routingdata om een instantie van de opgeven Controllerklasse te maken en de opgegeven methode uit te voeren:
      public static function dispatch($action)
      {
          try {
              $reflection = new \ReflectionClass($action['controllerClassName']);
              try {
                  $actionMethod = new \ReflectionMethod($action['controllerClassName'],
                      $action['actionMethodName']);
                  $controller = $reflection->newInstance();
                  return $actionMethod->invokeArgs($controller, 
                          array($action['parameterValue']));
              } catch (\ReflectionException $e) {
                  $actionMethodName = $action['actionMethodName'];
                  echo "Method $actionMethodName does not exist!";
                      return false;
              }
          } catch (\ReflectionException $e) {
              $controllerClassName = $action['controllerClassName'];
              echo "Class $controllerClassName does not exist!";
              return false;
          }
      }
    3. Plaats de dispatch methode in de FrontController klasse.

JI
2020-04-09 07:29:34